// rustfmt-normalize_comments: true
fn types() {
    let x: [ Vec   < _ > ] = [];
    let y:  * mut [ SomeType ; konst_funk() ] = expr();
    let z: (/*#digits*/ usize, /*exp*/ i16) = funk();
    let z: ( usize  /*#digits*/ , i16 /*exp*/ ) = funk();
}

struct F {
    f: extern "C" fn(x: u8, ... /* comment */),
    g: extern "C" fn(x: u8,/* comment */ ...),
    h: extern "C" fn(x: u8, ... ),
    i: extern "C" fn(x: u8, /* comment 4*/ y: String, // comment 3
                     z: Foo, /* comment */ .../* comment 2*/ ),
}

fn issue_1006(def_id_to_string: for<'a, 'b> unsafe fn(TyCtxt<'b, 'tcx, 'tcx>, DefId) -> String) {}

fn impl_trait_fn_1() -> impl Fn(i32) -> Option<u8> {}

fn impl_trait_fn_2<E>() -> impl Future<Item=&'a i64,Error=E> {}

fn issue_1234() {
    do_parse!(name: take_while1!(is_token) >> (Header))
}

// #2510
impl CombineTypes {
    pub fn pop_callback(
        &self,
        query_id: Uuid,
    ) -> Option<
        (
            ProjectId,
            Box<FnMut(&ProjectState, serde_json::Value, bool) -> () + Sync + Send>,
        ),
    > {
        self.query_callbacks()(&query_id)
    }
}

// #2859
pub fn do_something<'a, T: Trait1 + Trait2 + 'a>(&fooo: u32) -> impl Future<
    Item = (
        impl Future<Item = (
        ), Error =   SomeError> + 'a,
        impl Future<Item = (), Error = SomeError> + 'a,
impl Future<Item = (), Error = SomeError > + 'a,
    ),
    Error = SomeError,
    >
    +
    'a {
}

pub fn do_something<'a, T: Trait1 + Trait2 + 'a>(    &fooo: u32,
) -> impl Future<
    Item = (
impl Future<Item = (), Error = SomeError> + 'a,
        impl Future<Item = (), Error = SomeError> + 'a,
        impl Future<Item = (), Error = SomeError> + 'a,
    ),
    Error = SomeError,
    >
    + Future<
    Item = (
        impl Future<Item = (), Error = SomeError> + 'a,
impl Future<Item = (), Error = SomeError> + 'a,
        impl Future<Item = (), Error = SomeError> + 'a,
    ),
    Error = SomeError,
        >
    + Future<
    Item = (
        impl Future<Item = (), Error = SomeError> + 'a,
   impl Future<Item = (), Error = SomeError> + 'a,
        impl Future<Item = (), Error = SomeError> + 'a,
    ),
    Error = SomeError,
        >
    +
    'a + 'b +
    'c {
}

// #3051
token![impl];
token![ impl ];

// #3060
macro_rules! foo {
    ($foo_api: ty) => {
        type Target = ( $foo_api ) + 'static;
    }
}

type Target = ( FooAPI ) + 'static;

// #3137
fn foo<T>(t: T)
where
    T: ( FnOnce() -> () ) + Clone,
    U: ( FnOnce() -> () ) + 'static,
{
}

// #3117
fn issue3117() {
    {
        {
            {
                {
                    {
                        {
                            {
                                {
                                    let opt: &mut Option<MyLongTypeHere> =
                                        unsafe { &mut *self.future.get() };
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

// #3139
fn issue3139() {
    assert_eq!(
        to_json_value(&None ::  <i32>).unwrap(),
        json!(  { "test": None  ::  <i32> }  )
    );
}

// #3180
fn foo(a: SomeLongComplexType, b: SomeOtherLongComplexType) -> Box<Future<Item = AnotherLongType, Error = ALongErrorType>> {
}

type MyFn = fn(a: SomeLongComplexType, b: SomeOtherLongComplexType,) -> Box<Future<Item = AnotherLongType, Error = ALongErrorType>>;

// Const bound

trait T: ~   const  Super {}

const fn not_quite_const<S: ~  const    T>() -> i32 { <S as T>::CONST }

impl ~    const T {}

fn apit(_: impl ~   const T) {}

fn rpit() -> impl ~  const T { S }

pub struct Foo<T: Trait>(T);
impl<T:   ~  const Trait> Foo<T> {
    fn new(t: T) -> Self {
        Self(t)
    }
}

// #4357
type T = typeof(
1);
impl T for  .. {
}
